package com.example.demo.service;

import com.example.demo.dto.AiRequest;
import com.example.demo.dto.AiResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.chat.prompt.PromptTemplate;
import org.springframework.ai.deepseek.DeepSeekChatOptions;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Flux;

import java.util.Map;

/**
 * 智能生成服务
 * 提供营销文案生成、代码生成、智能问答等功能
 * 
 * @author Spring AI Demo
 */
@Service
public class SmartGeneratorService {

    private static final Logger logger = LoggerFactory.getLogger(SmartGeneratorService.class);

    private final ChatModel chatModel;

    public SmartGeneratorService(ChatModel chatModel) {
        this.chatModel = chatModel;
    }

    /**
     * 生成营销文案
     * 
     * @param request 请求参数
     * @return AI响应
     */
    public AiResponse generateMarketingContent(AiRequest request) {
        logger.info("开始生成营销文案，输入：{}", request.getContent());
        
        long startTime = System.currentTimeMillis();
        
        try {
            String systemPrompt = """
                你是一位专业的营销文案专家，擅长创作吸引人的营销内容。
                请根据用户的需求，生成具有以下特点的营销文案：
                1. 吸引眼球的标题
                2. 突出产品/服务的核心价值
                3. 使用情感化的语言
                4. 包含明确的行动号召
                5. 语言简洁有力，易于理解
                
                请用中文回复，格式清晰，内容富有创意。
                """;

            PromptTemplate promptTemplate = new PromptTemplate(systemPrompt + "\n\n用户需求：{content}");
            Prompt prompt = promptTemplate.create(Map.of("content", request.getContent()));

            // 设置营销文案生成的参数（创意性较高）
            DeepSeekChatOptions options = DeepSeekChatOptions.builder()
                    .temperature(request.getTemperature() != null ? request.getTemperature() : 1.3)
                    .maxTokens(request.getMaxTokens() != null ? request.getMaxTokens() : 800)
                    .build();

            var response = chatModel.call(new Prompt(prompt.getInstructions(), options));
            String content = response.getResult().getOutput().getText();

            long processingTime = System.currentTimeMillis() - startTime;
            logger.info("营销文案生成完成，耗时：{}ms", processingTime);

            AiResponse aiResponse = AiResponse.success(content, "deepseek-chat");
            aiResponse.setProcessingTimeMs(processingTime);
            return aiResponse;

        } catch (Exception e) {
            logger.error("营销文案生成失败", e);
            return AiResponse.error("营销文案生成失败：" + e.getMessage());
        }
    }

    /**
     * 生成代码
     * 
     * @param request 请求参数
     * @return AI响应
     */
    public AiResponse generateCode(AiRequest request) {
        logger.info("开始生成代码，需求：{}", request.getContent());
        
        long startTime = System.currentTimeMillis();
        
        try {
            String systemPrompt = """
                你是一位资深的软件工程师，精通多种编程语言和技术栈。
                请根据用户的需求，生成高质量的代码，要求：
                1. 代码结构清晰，逻辑合理
                2. 包含必要的注释说明
                3. 遵循最佳实践和编码规范
                4. 考虑错误处理和边界情况
                5. 如果需要，提供使用示例
                
                请用中文注释，代码要完整可运行。
                """;

            PromptTemplate promptTemplate = new PromptTemplate(systemPrompt + "\n\n编程需求：{content}");
            Prompt prompt = promptTemplate.create(Map.of("content", request.getContent()));

            // 设置代码生成的参数（准确性优先）
            DeepSeekChatOptions options = DeepSeekChatOptions.builder()
                    .temperature(request.getTemperature() != null ? request.getTemperature() : 0.1)
                    .maxTokens(request.getMaxTokens() != null ? request.getMaxTokens() : 1500)
                    .build();

            var response = chatModel.call(new Prompt(prompt.getInstructions(), options));
            String content = response.getResult().getOutput().getText();

            long processingTime = System.currentTimeMillis() - startTime;
            logger.info("代码生成完成，耗时：{}ms", processingTime);

            AiResponse aiResponse = AiResponse.success(content, "deepseek-chat");
            aiResponse.setProcessingTimeMs(processingTime);
            return aiResponse;

        } catch (Exception e) {
            logger.error("代码生成失败", e);
            return AiResponse.error("代码生成失败：" + e.getMessage());
        }
    }

    /**
     * 智能问答
     * 
     * @param request 请求参数
     * @return AI响应
     */
    public AiResponse answerQuestion(AiRequest request) {
        logger.info("开始智能问答，问题：{}", request.getContent());
        
        long startTime = System.currentTimeMillis();
        
        try {
            String systemPrompt = """
                你是一位知识渊博的AI助手，能够回答各种领域的问题。
                请根据用户的问题，提供准确、详细、有用的回答：
                1. 回答要准确可靠，基于事实
                2. 解释要清晰易懂，层次分明
                3. 如果涉及专业术语，请适当解释
                4. 如果问题复杂，可以分步骤说明
                5. 如果不确定答案，请诚实说明
                
                请用中文回复，语言友好专业。
                """;

            PromptTemplate promptTemplate = new PromptTemplate(systemPrompt + "\n\n用户问题：{content}");
            Prompt prompt = promptTemplate.create(Map.of("content", request.getContent()));

            // 设置问答的参数（平衡准确性和流畅性）
            DeepSeekChatOptions options = DeepSeekChatOptions.builder()
                    .temperature(request.getTemperature() != null ? request.getTemperature() : 0.7)
                    .maxTokens(request.getMaxTokens() != null ? request.getMaxTokens() : 1000)
                    .build();

            var response = chatModel.call(new Prompt(prompt.getInstructions(), options));
            String content = response.getResult().getOutput().getText();

            long processingTime = System.currentTimeMillis() - startTime;
            logger.info("智能问答完成，耗时：{}ms", processingTime);

            AiResponse aiResponse = AiResponse.success(content, "deepseek-chat");
            aiResponse.setProcessingTimeMs(processingTime);
            return aiResponse;

        } catch (Exception e) {
            logger.error("智能问答失败", e);
            return AiResponse.error("智能问答失败：" + e.getMessage());
        }
    }

    /**
     * 通用聊天
     * 
     * @param request 请求参数
     * @return AI响应
     */
    public AiResponse chat(AiRequest request) {
        logger.info("开始聊天对话，消息：{}", request.getContent());
        
        long startTime = System.currentTimeMillis();
        
        try {
            String systemPrompt = request.getSystemPrompt() != null ? 
                request.getSystemPrompt() : 
                """
                你是一位友好、有帮助的AI助手。
                请以自然、亲切的方式与用户对话：
                1. 保持友好和礼貌的语调
                2. 根据上下文提供有用的回复
                3. 如果用户需要帮助，尽力提供支持
                4. 保持对话的连贯性和趣味性
                
                请用中文回复，语言自然流畅。
                """;

            PromptTemplate promptTemplate = new PromptTemplate(systemPrompt + "\n\n用户：{content}");
            Prompt prompt = promptTemplate.create(Map.of("content", request.getContent()));

            // 设置聊天的参数（自然对话）
            DeepSeekChatOptions options = DeepSeekChatOptions.builder()
                    .temperature(request.getTemperature() != null ? request.getTemperature() : 0.9)
                    .maxTokens(request.getMaxTokens() != null ? request.getMaxTokens() : 800)
                    .build();

            var response = chatModel.call(new Prompt(prompt.getInstructions(), options));
            String content = response.getResult().getOutput().getText();

            long processingTime = System.currentTimeMillis() - startTime;
            logger.info("聊天对话完成，耗时：{}ms", processingTime);

            AiResponse aiResponse = AiResponse.success(content, "deepseek-chat");
            aiResponse.setProcessingTimeMs(processingTime);
            return aiResponse;

        } catch (Exception e) {
            logger.error("聊天对话失败", e);
            return AiResponse.error("聊天对话失败：" + e.getMessage());
        }
    }

    /**
     * 流式聊天
     * 
     * @param message 用户消息
     * @return 流式响应
     */
    public Flux<String> streamChat(String message) {
        logger.info("开始流式聊天，消息：{}", message);
        
        try {
            String systemPrompt = """
                你是一位友好、有帮助的AI助手。
                请以自然、亲切的方式与用户对话，用中文回复。
                """;

            PromptTemplate promptTemplate = new PromptTemplate(systemPrompt + "\n\n用户：{content}");
            Prompt prompt = promptTemplate.create(Map.of("content", message));

            DeepSeekChatOptions options = DeepSeekChatOptions.builder()
                    .temperature(0.9)
                    .maxTokens(800)
                    .build();

            return chatModel.stream(new Prompt(prompt.getInstructions(), options))
                    .map(response -> response.getResult().getOutput().getText())
                    .doOnNext(chunk -> logger.debug("流式响应块：{}", chunk))
                    .doOnComplete(() -> logger.info("流式聊天完成"))
                    .doOnError(error -> logger.error("流式聊天失败", error));

        } catch (Exception e) {
            logger.error("流式聊天启动失败", e);
            return Flux.error(e);
        }
    }
} 